"""
    @Author  ：思念 
    @File    ：9.生产者消费者模式.py
    @Date    ：2025/3/3 10:13 
"""

import threading
import queue
import time


def worker_1(q):
    for i in range(1,6):
        q.put(i)
        print("生产者：", i)
        time.sleep(2)


def worker_2(q):
    while True:
        i = q.get()
        print("消费者：", i)
        time.sleep(0.5)
        # 队列内部有一个任务计数器，当队列上传一个值则计数器+1
        # 当任务计数器为0则可以让队列.join()方法解开堵塞
        queue.task_done() # task_done()被调用一次则任务计数器-1

if __name__ == '__main__':
    queue = queue.Queue()
    t1 = threading.Thread(target=worker_1,args=(queue,))
    t2 = threading.Thread(target=worker_2,args=(queue,))
    t2.setDaemon(True)
    t1.start()
    t2.start()
    # 需要对有限循环的生产者任务join
    t1.join()
    queue.join() #当队列中的任务计数器为0时则释放主程序
    print("主线程即将结束。。。。。。")


"""
    1.消费者一般都是无限循环任务，基本都需要设置守护线程
    2.生产者一般生产有限的资源，所以无需设置守护线程
    3.消费者为守护线程时，可能会导致消费任务未执行完毕程序被强制退出，可以使用队列的任务计数器进行主线程堵塞:task_done/join
    4.若生产者生产速度过慢可能会导致队列任务计数器提前计算为0，可以设置生产者线程对象join，来保障计数器正常计算。
"""